package ecom;

//import org.apache.log4j.PropertyConfigurator;//put in the startup class
//import com.ensimag.dac.ejb.stateless.ChercheurStateless;
import ecom.api.IChercheurRemote;
import ecom.api.IProprietaireRemote;
import ecom.entity.ChercheurEntity;
import ecom.entity.ProprietaireEntity;
import java.io.Serializable;

import java.util.*;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.naming.NamingException;
import javax.faces.context.*;

import org.apache.commons.logging.*;

@ManagedBean
@SessionScoped
public class Utilisateur implements Serializable {

	private static final long serialVersionUID = 1L;


	Log log = LogFactory.getLog(Utilisateur.class);


	//PropertyConfigurator.configure("/home/vince/.jonas_base/conf/trace.properties");//chacun la sienne !

	// private CompteEntity myCompte;
	// private UtilisateurEntity myUtilisateur;
	private ChercheurEntity myChercheur;

	private ProprietaireEntity myProprietaire;

	@ManagedProperty(value = "#compteLogin")
	private CompteLogin compteLogin;


	public CompteLogin getCompteLogin() {
		return compteLogin;
	}

	public void setCompteLogin(CompteLogin compteLogin) {
		this.compteLogin = compteLogin;
	}

	private String nom;// compte
	private String prenom;
	private String pseudo;
	private String mdp;
	private String mdpverif;
	private String ville; // utilisateur
	private int departement;
	private String mail;
	private int numtel;
	private Date dateNaissance; // utilisateur
	private int type;
	private int CHERCHEUR = 1;
	private int PROPRIETAIRE = 2;



	public Utilisateur() {
		myChercheur = new ChercheurEntity();
		myProprietaire = new ProprietaireEntity();
	}

	// ************************ INSTANCES *************************

	private IChercheurRemote getInstanceChercheur() {
		try {
			javax.naming.Context ic = new javax.naming.InitialContext();
			return (IChercheurRemote) ic.lookup("ecom.stateless.ChercheurStateless@Remote");
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("Instance chercheur introuvable :", e);
		}
	}

	private IProprietaireRemote getInstanceProprietaire() {
		try {
			javax.naming.Context ic = new javax.naming.InitialContext();
			return (IProprietaireRemote) ic.lookup("ecom.stateless.ProprietaireStateless@Remote");
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("Instance proprietaire introuvable :", e);
		}
	}

	// *************** Valider : (persister) ********************


	public String creer() throws NamingException, RuntimeException {
		if(mdp.equals(mdpverif)) {
			if (this.type == CHERCHEUR) {
				try {
					getInstanceChercheur().create(nom, prenom, pseudo, mdp, ville, departement, mail, numtel, dateNaissance,"role1");
					compteLogin.setPseudo(pseudo);
					compteLogin.setMdp(mdp);
					compteLogin.login();
					log.info("Nouveau Compte Chercheur "+pseudo+" cree.");
				} catch (Exception e) {
					e.printStackTrace();
				}
			}else if (this.type == PROPRIETAIRE) {
				try {
					getInstanceProprietaire().create(nom, prenom, pseudo, mdp, ville, departement, mail, numtel, dateNaissance,"role1");
					compteLogin.setPseudo(pseudo);
					compteLogin.setMdp(mdp);
					compteLogin.login();
					log.info("Nouveau Compte Proprietaire "+pseudo+" cree.");
				} catch (Exception e) {
					e.printStackTrace();
				}
			}    		
		} else {
			FacesMessage error = new FacesMessage("Erreur", "Les mots de passe doivent etre identiques");
			FacesContext.getCurrentInstance().addMessage(null, error);
			return "CompteNouveau";
		}
		FacesMessage msg = new FacesMessage("Succes", "Compte cree!");
		FacesContext.getCurrentInstance().addMessage(null, msg);
		return "AnnoncesRecherche";
	}


	public String getMdp() {
		return mdp;
	}

	public void setMdp(String mdp) {
		this.mdp = mdp;
	}

	public String getNom() {
		return nom;
	}

	public void setNom(String nom) {
		this.nom = nom;
	}

	public String getPseudo() {
		return pseudo;
	}

	public void setPseudo(String pseudo) {
		this.pseudo = pseudo;
	}

	public String getVille() {
		return ville;
	}

	public void setVille(String ville) {
		this.ville = ville;
	}

	public Date getDateNaissance() {
		return dateNaissance;
	}

	public void setDateNaissance(Date dateNaissance) {
		this.dateNaissance = dateNaissance;
	}

	public String getPrenom() {
		return prenom;
	}

	public void setPrenom(String prenom) {
		this.prenom = prenom;
	}

	public int getType() {
		return type;
	}

	public void setType(int type) {
		this.type = type;
	}

	//premiereFois => je charge le compte
	private boolean premiereFois = true;
	public ChercheurEntity getMyChercheur() {
		if(premiereFois)
		{
			log.info("getter");
			if(compteLogin!=null)
			{String pseudoC = new String(compteLogin.getPseudoSpecial());
			if(pseudoC!=null)
			{
				log.info("/"+pseudoC);
				myChercheur = getInstanceChercheur().findPseudo(pseudoC);
				premiereFois = false;
			}
			else log.info("psudo null");
			}
			else log.info("comptelogi null");
		}

		return myChercheur;
	}




	public void setMyChercheur(ChercheurEntity myChercheur) {

		this.myChercheur = myChercheur;
	}

	public ProprietaireEntity getMyProprietaire() {
		if(premiereFois)
		{
			log.info("getter");
			if(compteLogin!=null)
			{String pseudoC = new String(compteLogin.getPseudoSpecial());
			if(pseudoC!=null)
			{
				log.info("/"+pseudoC);
				myProprietaire = getInstanceProprietaire().findPseudo(pseudoC);
				premiereFois = false;
			}
			else log.info("psudo null");
			}
			else log.info("comptelogi null");
		}


		return myProprietaire;
	}

	public void setMyProprietaire(ProprietaireEntity myProprietaire) {
		this.myProprietaire = myProprietaire;
	}

	/**
	 * @author Alexandra
	 */

	public String changeChercheur()
	{
		log.info(" debut nom mod: " +myChercheur.getMyUtilisateur().getNom());
		if(myChercheur.getMyUtilisateur().getMyCompteEntity().getMdp().equals(mdpverif))
		{
			try{
				myChercheur =  getInstanceChercheur().ModifChercheur(myChercheur.getId(), myChercheur.getMyUtilisateur().getNom(),
						myChercheur.getMyUtilisateur().getMyCompteEntity().getPrenom(),
						myChercheur.getMyUtilisateur().getMyCompteEntity().getMail(),
						myChercheur.getMyUtilisateur().getMyCompteEntity().getNumTel(),
						myChercheur.getMyUtilisateur().getMyCompteEntity().getMdp(),
						myChercheur.getMyUtilisateur().getDateNaissance(),
						myChercheur.getMyUtilisateur().getDepartement(),
						myChercheur.getMyUtilisateur().getVille());
				log.info("fin nom mod: " +myChercheur.getMyUtilisateur().getNom());
				FacesMessage msg = new FacesMessage("Succes", "Modifications sauvegardees");
				FacesContext.getCurrentInstance().addMessage(null, msg);

			}catch(Exception e){
				log.error("\n           Echec de la modifiaction du compte chercheur (id: "+myChercheur.getMyUtilisateur().getMyCompteEntity().getId()+")");
				FacesMessage error = new FacesMessage("Erreur", "Echec de la modification");
				FacesContext.getCurrentInstance().addMessage(null, error);
				return "CompteChercheurModif";
			}
		} else {
			FacesMessage error = new FacesMessage("Erreur", "Les mots de passe doivent etre identiques");
			FacesContext.getCurrentInstance().addMessage(null, error);
			return "CompteChercheurModif";
		}
		return "AnnoncesRecherche";
	}

	public String AnnulerModif(){
		log.info("annuler");
		return "AnnoncesRecherche";

	}

	public String changeProprietaire()
	{   	
		log.info(" debut nom mod: " +myProprietaire.getMyUtilisateur().getNom());
		if(myProprietaire.getMyUtilisateur().getMyCompteEntity().getMdp().equals(mdpverif))
		{
			try{
				myProprietaire =  getInstanceProprietaire().ModifProprietaire(myProprietaire.getId(),
						myProprietaire.getNom(),
						myProprietaire.getPrenom(),
						myProprietaire.getMail(),
						myProprietaire.getNumTel(),
						myProprietaire.getMyUtilisateur().getMyCompteEntity().getMdp(),
						myProprietaire.getMyUtilisateur().getDateNaissance(),
						myProprietaire.getMyUtilisateur().getDepartement(),
						myProprietaire.getMyUtilisateur().getVille());
				log.info("fin nom mod: " +myChercheur.getMyUtilisateur().getNom());
				FacesMessage msg = new FacesMessage("Succes", "Modifications sauvegardees");
				FacesContext.getCurrentInstance().addMessage(null, msg);

			}catch(Exception e){
				log.error("\n           Echec de la modifiaction du compte chercheur (id: "+myChercheur.getMyUtilisateur().getMyCompteEntity().getId()+")");
				FacesMessage error = new FacesMessage("Erreur", "Echec de la modification");
				FacesContext.getCurrentInstance().addMessage(null, error);
				return "CompteProprietaireModif";
			}    	 
		} else {
			FacesMessage error = new FacesMessage("Erreur", "Les mots de passe doivent etre identiques");
			FacesContext.getCurrentInstance().addMessage(null, error);
			return "CompteProprietaireModif";
		}
		return "AnnoncesRecherche";
	}

	public int getDepartement() {
		return departement;
	}

	public void setDepartement(int departement) {
		this.departement = departement;
	}

	public String getMdpverif() {
		return mdpverif;
	}

	public void setMdpverif(String mdpverif) {
		this.mdpverif = mdpverif;
	}

	public String getMail() {
		return mail;
	}

	public void setMail(String mail) {
		this.mail = mail;
	}

	public int getNumtel() {
		return numtel;
	}

	public void setNumtel(int numtel) {
		this.numtel = numtel;
	}




}
